
# -*- coding: utf-8 -*-

import debug
import threading
import logging
import time

from CamBase import CamBase

class Dummy(CamBase):
    '''
    ダミーカメラ用カメラコントロールクラス
        '''
    @debug.entry
    def __init__(self, config):
        fp = open(config['static_jpeg'], 'r')
        self.static_jpeg = fp.read()
        fp.close()

        self.MovieCaptureThread = None
        self.MovieEventObj      = None
        self.isCapture     = False

    def MovieCaptureLoop(self, target, storage):
        while not(self.MovieEventObj.is_set()):
            # time.sleep(0.33)
            logging.debug('movie captureLoop')
            if self.static_jpeg:
                storage.save_frame(target, self.static_jpeg, '.jpg')

    @debug.entry
    def getCamStatus(self):
        '''
        IPカメラの接続状態を取得する
        return:
            Success:True/False
            Response: OK/None
            Message: OK/Bad Response
        '''
        return {'Success':True, 'Response':'OK', 'Message':'OK'}

    @debug.entry
    def getFormatList(self):
        '''
        ビデオフォーマットリストを取得
        return: 
            Success: True
            Responce: ビデオフォーマットリスト(3個の文字列)
            Message: OK
        '''
        vlist = ('MJPEG')
        return {'Success':True, 'Response':vlist, 'Message':'OK'}

    @debug.entry
    def getVideoFormat(self):
        '''
        現在のビデオフォーマットを取得
        return: 
            Success: True/False
            Responce: 現在のビデオフォーマット(文字列)/None
            Message: OK/Bad Response
        '''
        vformat = 'MJPEG'
        return {'Success':True, 'Response':vformat, 'Message':'OK'}

    @debug.entry
    def getResolutionList(self):
        '''
        IPカメラに設定できる解像度のリストを取得する
        return: 
            Success: True
            Responce: 解像度リスト(3個のリスト)
            Message: OK
        '''
        rlist = ("640*480")
        return {'Success':True, 'Response':rlist, 'Message':'OK'}

    @debug.entry
    def getResolution(self):
        '''
        IPカメラの現在の解像度を取得する
        return:
            Success: True/False
            Responce: 現在の解像度(文字列)/None
            Message: OK/Bad Response
        '''
        return {'Success':True, 'Response':'640*480', 'Message':'OK'}
    
    @debug.entry
    def getSnapshot(self):
        '''
        IPカメラから静止画を取得する
        return:
            Success: True/False
            Responce: 画像データ(バイナリ, JPEG)/None
            Message: OK/Bad Response
        '''
        return {'Success':True, 'Response':self.static_jpeg, 'Message':'OK'}

    @debug.entry
    def startMovieCapture(self, target, storage):
        '''
        IPカメラで動画キャプチャを開始する
        target: 撮影対象となるカメラのコンフィグ名
            ex.) cam1, cam2, cam3 ...
        storage: 保存するストレージクラス
        return: 
            Success: True/False
            Responce: OK/None
            Message: OK/NG
        '''
        if self.MovieCaptureThread is not None:
            logging.debug('movie capture thread is started already.')
            return {'Success':False, 'Response':None, 'Message':'movie capture thread is started already.'}

        self.MovieEventObj      = threading.Event()
        self.MovieEventObj.clear()

        self.MovieCaptureThread = threading.Thread(target=self.MovieCaptureLoop, args=(target, storage))
        self.MovieCaptureThread.start()

        return {'Success':True, 'Response':'OK', 'Message':'OK'}

    @debug.entry
    def endMovieCapture(self):
        '''
        IPカメラの動画キャプチャを終了させる
        return:
            Success: True/False
            Responce: OK/None
            Message: OK/None
        '''
        if self.MovieCaptureThread is None:
            return {'Success':False, 'Response':None, 'Message':'movie capture thread is not running.'}
        
        # Wait to Finish Thread
        while self.MovieCaptureThread.is_alive():
            self.MovieEventObj.set()
            self.MovieCaptureThread.join(0.1)

        logging.debug('movie capture thread is finished.')
        self.MovieCaptureThread = None
        self.MovieEventObj      = None
            
        return {'Success':True, 'Response':'OK','Message':'OK'}

